package cn.org.queue.manage;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;

/**
 * @Package: cn.org.queue.manage
 * @ClassName: RocketQueueManager
 * @Description:
 * @Author: mac-pro
 * @CreateDate: 2019/2/18 下午4:57
 * @Version: 1.0
 */
@Slf4j
public class RocketQueueManager {
    private static final String HOST = "localhost";
    private static final int PORT = 9876;
    private static final String PRODUCER_GROUP_NAME = "ProducerGroupName";
    private static final String CONSUMER_GROUP_NAME = "ConsumerGroupName";
    private static final String PRODUCER = "Producer";
    private static final String CONSUMER = "Consumer";
    protected DefaultMQProducer producer;
    protected DefaultMQPushConsumer consumer;

    public RocketQueueManager() { init(); }
    public RocketQueueManager(String topic) { init(topic); }
    public void init(){
        try {
            /**
             * 一个应用创建一个Producer，由应用来维护此对象，可以设置为全局对象或者单例<br>
             * 注意：ProducerGroupName需要由应用来保证唯一<br>
             * ProducerGroup这个概念发送普通的消息时，作用不大，但是发送分布式事务消息时，比较关键，
             * 因为服务器会回查这个Group下的任意一个Producer
             */
            producer = new DefaultMQProducer(PRODUCER_GROUP_NAME);
            producer.setNamesrvAddr(String.format("%s:%s",HOST,PORT));
            producer.setInstanceName(PRODUCER);
            /**
             * Producer对象在使用之前必须要调用start初始化，初始化一次即可<br>
             * 注意：切记不可以在每次发送消息时，都调用start方法
             */
            producer.start();
        } catch (MQClientException e) {
            log.error("init rocket queue is error", e);
        }
    }
    public void init(String topic){
        try {
            /**
             * 一个应用创建一个Consumer，由应用来维护此对象，可以设置为全局对象或者单例<br>
             * 注意：ConsumerGroupName需要由应用来保证唯一
             */
            consumer = new DefaultMQPushConsumer(CONSUMER_GROUP_NAME);
            consumer.setNamesrvAddr(String.format("%s:%s",HOST,PORT));
            consumer.setInstanceName(CONSUMER);
            /**
             * 订阅指定topic下tags分别等于TagA或TagC或TagD
             */
            //consumer.subscribe("TopicTest1", "TagA || TagC || TagD");
            /**
             * 订阅指定topic下所有消息<br>
             * 注意：一个consumer对象可以订阅多个topic
             */
            consumer.subscribe(topic, "*");
            /**
             * Consumer对象在使用之前必须要调用start初始化，初始化一次即可<br>
             */
            consumer.start();
        } catch (MQClientException e) {

        }

    }
}
